// 残り時間推定クラス // (c)2010 ana53, AirparkLab /* 使い方 // 確保 #include "remain_time.h" CRemainTime RemainTime; // 測定開始 DWORD dwWorkCount = 10000; // 総作業量 RemainTime.Start( dwWorkCount ); // 残り時間取得 DWORD dwNowCount = 100; // 作業済 DWORD dwWorkSec; // 作業秒数取得変数 DWORD dwRemainSec; // 残り時間取得変数 RemainTime.Query( dwNowCount, &dwWorkSec, &dwRemainSec ); */ #ifndef __REMAIN_TIME_H__ #define __REMAIN_TIME_H__ #include class CRemainTime { public: time_t m_StartTime; // 測定開始時刻 DWORD m_dwStartTick; // 測定開始カウンタ DWORD m_dwWorkCount; // 総作業量 // コンストラクタ CRemainTime() { this->m_StartTime = 0; this->m_dwStartTick = 0; this->m_dwWorkCount = 0; } // デストラクタ ~CRemainTime() { ; } // 測定開始 time_t Start( DWORD dwWorkCount ) { // 測定開始時刻を保存 this->m_StartTime = time( NULL ); this->m_dwStartTick = ::GetTickCount(); // 総作業量を保存 this->m_dwWorkCount = dwWorkCount; // 測定開始時刻を戻す return this->m_StartTime; } // 残り時間取得 time_t Query( DWORD dwNowCount, DWORD *p_dwWorkSec, DWORD *p_dwRemainSec ) { time_t NowTime; DWORD dwNowTick; DWORD dwWorkSec1000, dwRemainSec1000; // 現在時刻を取得 NowTime = time( NULL ); dwNowTick = ::GetTickCount(); // これまでの作業時間を計算 dwWorkSec1000 = (dwNowTick - this->m_dwStartTick); if( p_dwWorkSec ){ *p_dwWorkSec = dwWorkSec1000 / 1000; } // 残り作業時間を計算 if( dwNowCount == 0 ){ dwNowCount = 1; } dwRemainSec1000 = (this->m_dwWorkCount - dwNowCount) * dwWorkSec1000 / dwNowCount; if( p_dwRemainSec ){ *p_dwRemainSec = dwRemainSec1000 / 1000 + 1; } // 推定終了時刻を戻す NowTime += ((dwRemainSec1000 / 1000) + 1); return NowTime; } }; #endif